package ipt.pru.F3;

import ipt.util.Util;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * 
 * @author alumno11
 *
 */
public class pruebaExamenAitor implements InterfazParseo {
	//Le decimos en que carpeta se encuentra nuesto log4J
	private static final String PATH_L4J = "config/log4jF3.properties";
	//Creamos un logger
	private final static Logger log = Logger.getLogger(pruebaExamenAitor.class);
	//Almacenamos la ruta donde vamos a guardar las noticias una vez guardadas en nuestro ordenador.
	private static final String PATH="noticias//";
	//Url de la pagina a la que estamos accediendo
	private static String URL = "http://www.formacion.ipartek.com/noticia_detalle.asp?noticia=";
	//El id de noticia que va cambiando para cada noticia 
	private static int id_noticia = 204;
	//Clase de las etiquetas a las que queremos acceder.
	private static String titulonoticia="titnoticia";
	private static String cuerponoticia="cuerponoticia";
	
	public pruebaExamenAitor(){
		super();
	}
	
	public static String getURL() {
		return URL;
	}

	public static void setURL(String uRL) {
		URL = uRL;
	}

	public static int getId_noticia() {
		return id_noticia;
	}

	public static void setId_noticia(int id_noticia) {
		pruebaExamenAitor.id_noticia = id_noticia;
	}

	public static String getTitulonoticia() {
		return titulonoticia;
	}

	public static void setTitulonoticia(String titulonoticia) {
		pruebaExamenAitor.titulonoticia = titulonoticia;
	}

	public static String getCuerponoticia() {
		return cuerponoticia;
	}

	public static void setCuerponoticia(String cuerponoticia) {
		pruebaExamenAitor.cuerponoticia = cuerponoticia;
	}
	
	/**
	 * Funcion que recibe un texto de una noticia y coloca la fecha al final en vez de al principio
	 * @param text noticia que recibe con la fecha al principio
	 * @return Devuelve la noticia con la fecha colocada al final y en otra linea
	 */
	public static String quitarFecha(String text){
		int posicionTexto=text.indexOf("-") - 1;
		String fecha = text.substring(0,posicionTexto);
		text=text.substring(posicionTexto, text.length());
		fecha = fecha.replaceAll("/", "-");
		text=text+"      "+"<"+fecha+">";
		return text;
	}
	
	/**
	 * Funcion que llama al resto de funciones para descargar la pagina, buscar la noticia y grabarla en un fichero.
	 */
	private static void parseo(){
		try{
			pruebaExamenAitor cl = new pruebaExamenAitor();
			Document doc= cl.donwloadFile(URL+id_noticia);
			String texto=cl.navegation(titulonoticia, cuerponoticia,  doc);
			String ruta= PATH+"Noticia"+id_noticia+".txt";
			cl.saveFile(quitarFecha(texto), ruta);
			log.info("Fichero creado");
		}catch(IOException e){
			log.error("Fallo al intentar Parsear la noticia");
		}
	}	
	/**
	 * Funcion que se conecta a la URL deseada y descarga la pagina
	 */
	public Document donwloadFile(String url) {
		// TODO Auto-generated method stub
		try{
			Document doc = Jsoup.connect(URL + id_noticia).get(); 
			log.info("Url descargada correctamente.");
			return  doc;
		}catch(IOException e){
			log.error("Error al descargar la URL.");
			return null;	
		}
	}
	@Override
	/**
	 * Funcion que busca el titulo de a noticia y el cuerpo de la noticia dentro de toda la pagina web
	 */
	public String navegation(String clasetitulo, String clasecuerpo,Document doc) {
		// TODO Auto-generated method stub
		org.jsoup.nodes.Element el=(Element) doc.getElementById("news");
		Elements titulo=el.getElementsByClass(titulonoticia);
		Elements cuerpo=el.getElementsByClass(cuerponoticia);
		//Por simplificar creamos una variable con todo el nombre del fichero y otra con el texto.
		String texto=titulo.text()+"\n"+cuerpo.text();
		return texto;
	}
	/**
	 * Recibe un texto y una ruta y escribeel fichero.
	 */
	public Boolean saveFile(String doc, String ruta) throws IOException{
		FileWriter fW = null;
		BufferedWriter bW = null;
		try {
			fW = new FileWriter(ruta);
			bW = new BufferedWriter(fW);
			fW.write(doc);
			log.info("Fichero salvado correctamente");
			return true;
			
			} catch (IOException e) {
			log.error("No se ha podido escribir el fichero");
			return false;
		} finally {
			if (fW != null)
				fW.close();
			if (bW != null)
				bW.close();
		}
	}
	/**
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		long time_inicio = System.currentTimeMillis();
		PropertyConfigurator.configure(PATH_L4J);
		parseo();
		long time_fin = System.currentTimeMillis();
		long t=time_fin-time_inicio;
		log.info("Proceso iniciado " +Util.conversorFecha(time_inicio)+ " Tiempo de proceso: " + t) ;
	}
	
}
